﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace Cotizav.AccesoDatos
{
    public class CotizacionDAO
    {

        public int Registrar(Util.ContextoDB ctx, Entidades.Cotizacion newCotizacion)
        {
            SqlCommand cmd = new SqlCommand("USP_COTIZACION_INSERT", ctx.GetConexion(), ctx.GetTx());
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@ID", 0).Direction = System.Data.ParameterDirection.Output;
            cmd.Parameters.AddWithValue("@IDTIPOCOTIZACION", newCotizacion.IdTipoCotizacion.HasValue ? newCotizacion.IdTipoCotizacion.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDCLIENTE", newCotizacion.IdCliente.HasValue ? newCotizacion.IdCliente.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDVENDEDOR", newCotizacion.IdVendedor.HasValue ? newCotizacion.IdVendedor.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDSUCURSAL", newCotizacion.IdSucursal.HasValue ? newCotizacion.IdSucursal.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDCONTACTO", newCotizacion.IdContacto.HasValue ? newCotizacion.IdContacto.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@CODIGOCOTIZACION", newCotizacion.CodigoCotizacion ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@NUMEROCOTIZACION", newCotizacion.NumeroCotizacion);
            cmd.Parameters.AddWithValue("@OBRA", newCotizacion.Obra ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@REFERENCIA", newCotizacion.Referencia ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@TIPOCAMBIO", newCotizacion.TipoCambio);
            cmd.Parameters.AddWithValue("@MONEDA", newCotizacion.Moneda ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IGV", newCotizacion.Igv ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@NOMBRECLIENTE", newCotizacion.NombreCliente ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@NOMBREVENDEDOR", newCotizacion.NombreVendedor ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@NOMBRESUCURSAL", newCotizacion.NombreSucursal ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@NOMBRECONTACTO", newCotizacion.NombreContacto ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@PRECIOTOTAL", newCotizacion.PrecioTotal.HasValue ? newCotizacion.PrecioTotal.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@PRECIOTOTALEXT", newCotizacion.PrecioTotalExt.HasValue ? newCotizacion.PrecioTotalExt.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@PRECIOTOTALLOC", newCotizacion.PrecioTotalLoc.HasValue ? newCotizacion.PrecioTotalLoc.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@DSCTO", newCotizacion.Dscto.HasValue ? newCotizacion.Dscto.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@DSCTOEXT", newCotizacion.DsctoExt.HasValue ? newCotizacion.DsctoExt.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@DSCTOLOC", newCotizacion.DsctoLoc.HasValue ? newCotizacion.DsctoLoc.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@VALORVENTA", newCotizacion.ValorVenta.HasValue ? newCotizacion.ValorVenta.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@VALORVENTAEXT", newCotizacion.ValorVentaExt.HasValue ? newCotizacion.ValorVentaExt.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@VALORVENTALOC", newCotizacion.ValorVentaLoc.HasValue ? newCotizacion.ValorVentaLoc.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IMPUESTOS", newCotizacion.Impuestos.HasValue ? newCotizacion.Impuestos.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IMPUESTOSEXT", newCotizacion.ImpuestosExt.HasValue ? newCotizacion.ImpuestosExt.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IMPUESTOSLOC", newCotizacion.ImpuestosLoc.HasValue ? newCotizacion.ImpuestosLoc.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@TOTAL", newCotizacion.Total.HasValue ? newCotizacion.Total.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@TOTALEXT", newCotizacion.TotalExt.HasValue ? newCotizacion.TotalExt.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@TOTALLOC", newCotizacion.TotalLoc.HasValue ? newCotizacion.TotalLoc.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@ESTADO", newCotizacion.Estado ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@ACTIVO", newCotizacion.Activo);
            cmd.Parameters.AddWithValue("@FECHAREGISTRO", newCotizacion.FechaRegistro.HasValue ? newCotizacion.FechaRegistro.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@FECHAMODIFICACION", newCotizacion.FechaModificacion.HasValue ? newCotizacion.FechaModificacion.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@USUARIOREGISTRO", newCotizacion.UsuarioRegistro ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@USUARIOMODIFICACION", newCotizacion.UsuarioModificacion ?? (object)DBNull.Value);

            int resultado = cmd.ExecuteNonQuery();

            int id = Int32.Parse(cmd.Parameters["@ID"].Value.ToString());
            newCotizacion.IdCotizacion = id;

            return resultado;
        }

        public List<Entidades.Cotizacion> Listar(Util.ContextoDB ctx, string condicion)
        {
            SqlCommand cmd = new SqlCommand(string.Format("select * from COTIZACION {0}", condicion), ctx.GetConexion());
            DataTable dtCotizacion = new DataTable();
            dtCotizacion.Load(cmd.ExecuteReader());

            List<Entidades.Cotizacion> lista = new List<Entidades.Cotizacion>();

            foreach (DataRow fila in dtCotizacion.Rows)
            {
                Entidades.Cotizacion c = new Entidades.Cotizacion();

                c.IdCotizacion = Int32.Parse(fila["ID"].ToString());
                c.IdTipoCotizacion = !(fila["IDTIPOCOTIZACION"] is DBNull) ? Int32.Parse(fila["IDTIPOCOTIZACION"].ToString()) : new Nullable<int>();
                c.IdCliente = !(fila["IDCLIENTE"] is DBNull) ? Int32.Parse(fila["IDCLIENTE"].ToString()) : new Nullable<int>();
                c.IdVendedor = !(fila["IDVENDEDOR"] is DBNull) ? Int32.Parse(fila["IDVENDEDOR"].ToString()) : new Nullable<int>();
                c.IdSucursal = !(fila["IDSUCURSAL"] is DBNull) ?  Int32.Parse(fila["IDSUCURSAL"].ToString()) : new Nullable<int>();
                c.IdContacto = !(fila["IDCONTACTO"] is DBNull) ? Int32.Parse(fila["IDCONTACTO"].ToString()) : new Nullable<int>();
                c.CodigoCotizacion = fila["CODIGOCOTIZACION"].ToString();
                c.NumeroCotizacion = !(fila["NUMEROCOTIZACION"] is DBNull) ? Int32.Parse(fila["NUMEROCOTIZACION"].ToString()) : -1;
                c.Obra = fila["OBRA"].ToString();
                c.Referencia = fila["REFERENCIA"].ToString();
                c.TipoCambio = !(fila["TIPOCAMBIO"] is DBNull) ? decimal.Parse(fila["TIPOCAMBIO"].ToString()) : new Nullable<decimal>();
                c.Moneda = fila["MONEDA"].ToString();
                c.Igv = fila["IGV"].ToString();
                c.NombreCliente = fila["NOMBRECLIENTE"].ToString();
                c.NombreVendedor = fila["NOMBREVENDEDOR"].ToString();
                c.NombreSucursal = fila["NOMBRESUCURSAL"].ToString();
                c.NombreContacto = fila["NOMBRECONTACTO"].ToString();
                c.PrecioTotal = !(fila["PRECIOTOTAL"] is DBNull) ? decimal.Parse(fila["PRECIOTOTAL"].ToString()) : new Nullable<decimal>();
                c.PrecioTotalExt = !(fila["PRECIOTOTALEXT"] is DBNull) ? decimal.Parse(fila["PRECIOTOTALEXT"].ToString()) : new Nullable<decimal>();
                c.PrecioTotalLoc = !(fila["PRECIOTOTALLOC"] is DBNull) ? decimal.Parse(fila["PRECIOTOTALLOC"].ToString()) : new Nullable<decimal>();
                c.Dscto = !(fila["DSCTO"] is DBNull) ? decimal.Parse(fila["DSCTO"].ToString()) : new Nullable<decimal>();
                c.DsctoExt = !(fila["DSCTOEXT"] is DBNull) ? decimal.Parse(fila["DSCTOEXT"].ToString()) : new Nullable<decimal>();
                c.DsctoLoc = !(fila["DSCTOLOC"] is DBNull) ? decimal.Parse(fila["DSCTOLOC"].ToString()) : new Nullable<decimal>();
                c.ValorVenta = !(fila["VALORVENTA"] is DBNull) ? decimal.Parse(fila["VALORVENTA"].ToString()) : new Nullable<decimal>();
                c.ValorVentaExt = !(fila["VALORVENTAEXT"] is DBNull) ? decimal.Parse(fila["VALORVENTAEXT"].ToString()) : new Nullable<decimal>();
                c.ValorVentaLoc = !(fila["VALORVENTALOC"] is DBNull) ? decimal.Parse(fila["VALORVENTALOC"].ToString()) : new Nullable<decimal>();
                c.Impuestos = !(fila["IMPUESTOS"] is DBNull) ? decimal.Parse(fila["IMPUESTOS"].ToString()) : new Nullable<decimal>();
                c.ImpuestosExt = !(fila["IMPUESTOSEXT"] is DBNull) ? decimal.Parse(fila["IMPUESTOSEXT"].ToString()) : new Nullable<decimal>();
                c.ImpuestosLoc = !(fila["IMPUESTOSLOC"] is DBNull) ? decimal.Parse(fila["IMPUESTOSLOC"].ToString()) : new Nullable<decimal>();
                c.Total = !(fila["TOTAL"] is DBNull) ? decimal.Parse(fila["TOTAL"].ToString()) : new Nullable<decimal>();
                c.TotalExt = !(fila["TOTALEXT"] is DBNull) ? decimal.Parse(fila["TOTALEXT"].ToString()) : new Nullable<decimal>();
                c.TotalLoc = !(fila["TOTALLOC"] is DBNull) ? decimal.Parse(fila["TOTALLOC"].ToString()) : new Nullable<decimal>();
                c.Estado = fila["ESTADO"].ToString();
                c.Activo = !(fila["ACTIVO"] is DBNull) ? Int32.Parse(fila["ACTIVO"].ToString()) : -1;
                c.FechaRegistro = !(fila["FECHAREGISTRO"] is DBNull) ? Convert.ToDateTime(fila["FECHAREGISTRO"].ToString()) : new Nullable<DateTime>();
                c.FechaModificacion = !(fila["FECHAMODIFICACION"] is DBNull) ? Convert.ToDateTime(fila["FECHAMODIFICACION"].ToString()) : new Nullable<DateTime>();
                c.UsuarioRegistro = fila["USUARIOREGISTRO"].ToString();
                c.UsuarioModificacion = fila["USUARIOMODIFICACION"].ToString();

                lista.Add(c);
            }

            return lista;
        }

        public List<Entidades.Cotizacion> Obtener(Util.ContextoDB ctx, Entidades.Cotizacion selectedCotizacion)
        {
            SqlCommand cmd = new SqlCommand(string.Format("select * from COTIZACION where Id = {0}", selectedCotizacion.IdCotizacion), ctx.GetConexion());
            DataTable dtCotizacion = new DataTable();
            dtCotizacion.Load(cmd.ExecuteReader());

            List<Entidades.Cotizacion> lista = new List<Entidades.Cotizacion>();

            foreach (DataRow fila in dtCotizacion.Rows)
            {
                Entidades.Cotizacion c = new Entidades.Cotizacion();

                c.IdCotizacion = Int32.Parse(fila["ID"].ToString());
                c.IdTipoCotizacion = !(fila["IDTIPOCOTIZACION"] is DBNull) ? Int32.Parse(fila["IDTIPOCOTIZACION"].ToString()) : new Nullable<int>();
                c.IdCliente = !(fila["IDCLIENTE"] is DBNull) ? Int32.Parse(fila["IDCLIENTE"].ToString()) : new Nullable<int>();
                c.IdVendedor = !(fila["IDVENDEDOR"] is DBNull) ? Int32.Parse(fila["IDVENDEDOR"].ToString()) : new Nullable<int>();
                c.IdSucursal = !(fila["IDSUCURSAL"] is DBNull) ? Int32.Parse(fila["IDSUCURSAL"].ToString()) : new Nullable<int>();
                c.IdContacto = !(fila["IDCONTACTO"] is DBNull) ? Int32.Parse(fila["IDCONTACTO"].ToString()) : new Nullable<int>();
                c.CodigoCotizacion = fila["CODIGOCOTIZACION"].ToString();
                c.NumeroCotizacion = !(fila["NUMEROCOTIZACION"] is DBNull) ? Int32.Parse(fila["NUMEROCOTIZACION"].ToString()) : -1;
                c.Obra = fila["OBRA"].ToString();
                c.Referencia = fila["REFERENCIA"].ToString();
                c.TipoCambio = !(fila["TIPOCAMBIO"] is DBNull) ? decimal.Parse(fila["TIPOCAMBIO"].ToString()) : new Nullable<decimal>();
                c.Moneda = fila["MONEDA"].ToString();
                c.Igv = fila["IGV"].ToString();
                c.NombreCliente = fila["NOMBRECLIENTE"].ToString();
                c.NombreVendedor = fila["NOMBREVENDEDOR"].ToString();
                c.NombreSucursal = fila["NOMBRESUCURSAL"].ToString();
                c.NombreContacto = fila["NOMBRECONTACTO"].ToString();
                c.PrecioTotal = !(fila["PRECIOTOTAL"] is DBNull) ? decimal.Parse(fila["PRECIOTOTAL"].ToString()) : new Nullable<decimal>();
                c.PrecioTotalExt = !(fila["PRECIOTOTALEXT"] is DBNull) ? decimal.Parse(fila["PRECIOTOTALEXT"].ToString()) : new Nullable<decimal>();
                c.PrecioTotalLoc = !(fila["PRECIOTOTALLOC"] is DBNull) ? decimal.Parse(fila["PRECIOTOTALLOC"].ToString()) : new Nullable<decimal>();
                c.Dscto = !(fila["DSCTO"] is DBNull) ? decimal.Parse(fila["DSCTO"].ToString()) : new Nullable<decimal>();
                c.DsctoExt = !(fila["DSCTOEXT"] is DBNull) ? decimal.Parse(fila["DSCTOEXT"].ToString()) : new Nullable<decimal>();
                c.DsctoLoc = !(fila["DSCTOLOC"] is DBNull) ? decimal.Parse(fila["DSCTOLOC"].ToString()) : new Nullable<decimal>();
                c.ValorVenta = !(fila["VALORVENTA"] is DBNull) ? decimal.Parse(fila["VALORVENTA"].ToString()) : new Nullable<decimal>();
                c.ValorVentaExt = !(fila["VALORVENTAEXT"] is DBNull) ? decimal.Parse(fila["VALORVENTAEXT"].ToString()) : new Nullable<decimal>();
                c.ValorVentaLoc = !(fila["VALORVENTALOC"] is DBNull) ? decimal.Parse(fila["VALORVENTALOC"].ToString()) : new Nullable<decimal>();
                c.Impuestos = !(fila["IMPUESTOS"] is DBNull) ? decimal.Parse(fila["IMPUESTOS"].ToString()) : new Nullable<decimal>();
                c.ImpuestosExt = !(fila["IMPUESTOSEXT"] is DBNull) ? decimal.Parse(fila["IMPUESTOSEXT"].ToString()) : new Nullable<decimal>();
                c.ImpuestosLoc = !(fila["IMPUESTOSLOC"] is DBNull) ? decimal.Parse(fila["IMPUESTOSLOC"].ToString()) : new Nullable<decimal>();
                c.Total = !(fila["TOTAL"] is DBNull) ? decimal.Parse(fila["TOTAL"].ToString()) : new Nullable<decimal>();
                c.TotalExt = !(fila["TOTALEXT"] is DBNull) ? decimal.Parse(fila["TOTALEXT"].ToString()) : new Nullable<decimal>();
                c.TotalLoc = !(fila["TOTALLOC"] is DBNull) ? decimal.Parse(fila["TOTALLOC"].ToString()) : new Nullable<decimal>();
                c.Estado = fila["ESTADO"].ToString();
                c.Activo = !(fila["ACTIVO"] is DBNull) ? Int32.Parse(fila["ACTIVO"].ToString()) : -1;
                c.FechaRegistro = !(fila["FECHAREGISTRO"] is DBNull) ? Convert.ToDateTime(fila["FECHAREGISTRO"].ToString()) : new Nullable<DateTime>();
                c.FechaModificacion = !(fila["FECHAMODIFICACION"] is DBNull) ? Convert.ToDateTime(fila["FECHAMODIFICACION"].ToString()) : new Nullable<DateTime>();
                c.UsuarioRegistro = fila["USUARIOREGISTRO"].ToString();
                c.UsuarioModificacion = fila["USUARIOMODIFICACION"].ToString();

                lista.Add(c);
            }

            return lista;
        }
    }
}
